{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "6TuWv0Y0sY8n"
   },
   "source": [
    "# Getting Started in TensorFlow\n",
    "## A look at a very simple neural network in TensorFlow"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "u9J5e2mQsYsQ"
   },
   "source": [
    "This is an introduction to working with TensorFlow. It works through an example of a very simple neural network, walking through the steps of setting up the input, adding operators, setting up gradient descent, and running the computation graph. \n",
    "\n",
    "This tutorial presumes some familiarity with the TensorFlow computational model, which is introduced in the [Hello, TensorFlow](../notebooks/1_hello_tensorflow.ipynb) notebook, also available in this bundle."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Dr2Sv0vD8rT-"
   },
   "source": [
    "## A simple neural network\n",
    "\n",
    "Let's start with code. We're going to construct a very simple neural network computing a linear regression between two variables, y and x. The function it tries to compute is the best $w_1$ and $w_2$ it can find for the function $y = w_2 x + w_1$ for the data. The data we're going to give it is toy data, linear perturbed with random noise.\n",
    "\n",
    "This is what the network looks like:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:30:56.880451",
     "start_time": "2016-09-16T14:30:56.854405"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {}
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "id": "q09my4JYtKXw",
    "outputId": "22b94683-437b-45ed-f6b8-4abf3b76ce38"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/anaconda3/lib/python3.5/site-packages/ipykernel/__main__.py:5: DeprecationWarning: decodestring() is a deprecated alias, use decodebytes()\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from __future__ import print_function\n",
    "\n",
    "from IPython.display import Image\n",
    "import base64\n",
    "Image(data=base64.decodestring(\"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\".encode('utf-8')), embed=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "fBQq_R8B8rRf"
   },
   "source": [
    "Here is the TensorFlow code for this simple neural network and the results of running this code:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:31:31.203004",
     "start_time": "2016-09-16T14:31:30.704391"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 665,
     "status": "ok",
     "timestamp": 1446658971218,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "4896c353dcc58d9f",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "Dy8pFefa_Ho_",
    "outputId": "5a95f8c8-0c32-411d-956d-bb81aeed8e50"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9a7c017a20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#@test {\"output\": \"ignore\"}\n",
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "# Set up the data with a noisy linear relationship between X and Y.\n",
    "num_examples = 50\n",
    "X = np.array([np.linspace(-2, 4, num_examples), np.linspace(-6, 6, num_examples)])\n",
    "X += np.random.randn(2, num_examples)\n",
    "x, y = X\n",
    "x_with_bias = np.array([(1., a) for a in x]).astype(np.float32)\n",
    "\n",
    "losses = []\n",
    "training_steps = 50\n",
    "learning_rate = 0.002\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    # Set up all the tensors, variables, and operations.\n",
    "    input = tf.constant(x_with_bias)\n",
    "    target = tf.constant(np.transpose([y]).astype(np.float32))\n",
    "    weights = tf.Variable(tf.random_normal([2, 1], 0, 0.1))\n",
    "\n",
    "    tf.initialize_all_variables().run()\n",
    "\n",
    "    yhat = tf.matmul(input, weights)\n",
    "    yerror = tf.sub(yhat, target)\n",
    "    loss = tf.nn.l2_loss(yerror)\n",
    "  \n",
    "    update_weights = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)\n",
    "  \n",
    "    for _ in range(training_steps):\n",
    "        # Repeatedly run the operations, updating the TensorFlow variable.\n",
    "        update_weights.run()\n",
    "        losses.append(loss.eval())\n",
    "\n",
    "    # Training is done, get the final values for the graphs\n",
    "    betas = weights.eval()\n",
    "    yhat = yhat.eval()\n",
    "\n",
    "# Show the fit and the loss over time.\n",
    "fig, (ax1, ax2) = plt.subplots(1, 2)\n",
    "plt.subplots_adjust(wspace=.3)\n",
    "fig.set_size_inches(10, 4)\n",
    "ax1.scatter(x, y, alpha=.7)\n",
    "ax1.scatter(x, np.transpose(yhat)[0], c=\"g\", alpha=.6)\n",
    "line_x_range = (-4, 6)\n",
    "ax1.plot(line_x_range, [betas[0] + a * betas[1] for a in line_x_range], \"g\", alpha=0.6)\n",
    "ax2.plot(range(0, training_steps), losses)\n",
    "ax2.set_ylabel(\"Loss\")\n",
    "ax2.set_xlabel(\"Training steps\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "vNtkU8h18rOv"
   },
   "source": [
    "In the remainder of this notebook, we'll go through this example in more detail."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "r6rsv-q5gnn-"
   },
   "source": [
    "## From the beginning\n",
    "\n",
    "Let's walk through exactly what this is doing from the beginning. We'll start with what the data looks like, then we'll look at this neural network, what is executed when, what gradient descent is doing, and how it all works together."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "UgtkJKqAjuDj"
   },
   "source": [
    "## The data\n",
    "\n",
    "This is a toy data set here. We have 50 (x,y) data points. At first, the data is perfectly linear."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:31:33.923639",
     "start_time": "2016-09-16T14:31:33.724554"
    },
    "cellView": "form",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 398,
     "status": "ok",
     "timestamp": 1446659128547,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "4896c353dcc58d9f",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "-uoBWol3klhA",
    "outputId": "efef4adf-42de-4e6f-e0c3-07ddd3083d85"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n1ZAcyT0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9a67fb4fd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#@test {\"output\": \"ignore\"}\n",
    "num_examples = 50\n",
    "X = np.array([np.linspace(-2, 4, num_examples), np.linspace(-6, 6, num_examples)])\n",
    "plt.figure(figsize=(4,4))\n",
    "plt.scatter(X[0], X[1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "AId3xHBNlcnk"
   },
   "source": [
    "Then we perturb it with noise:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:31:35.755403",
     "start_time": "2016-09-16T14:31:35.572825"
    },
    "cellView": "form",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 327,
     "status": "ok",
     "timestamp": 1446659134929,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "4896c353dcc58d9f",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "fXcGNNtjlX63",
    "outputId": "231c945e-e4a4-409e-b75b-8a8fe1fdfc30"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9a67fb4e10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#@test {\"output\": \"ignore\"}\n",
    "X += np.random.randn(2, num_examples)\n",
    "plt.figure(figsize=(4,4))\n",
    "plt.scatter(X[0], X[1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "3dc1cl5imNLM"
   },
   "source": [
    "## What we want to do\n",
    "\n",
    "What we're trying to do is calculate the green line below:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:31:37.772603",
     "start_time": "2016-09-16T14:31:37.508209"
    },
    "cellView": "form",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 414,
     "status": "ok",
     "timestamp": 1446659137254,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "4896c353dcc58d9f",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "P0m-3Mf8sQaA",
    "outputId": "74e74f19-6ff8-4a8c-81c7-9021a08b78b5"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9a387871d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#@test {\"output\": \"ignore\"}\n",
    "weights = np.polyfit(X[0], X[1], 1)\n",
    "plt.figure(figsize=(4,4))\n",
    "plt.scatter(X[0], X[1])\n",
    "line_x_range = (-3, 5)\n",
    "plt.plot(line_x_range, [weights[1] + a * weights[0] for a in line_x_range], \"g\", alpha=0.8)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "VYUr2uPA9ah8"
   },
   "source": [
    "Remember that our simple network looks like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:32:02.494004",
     "start_time": "2016-09-16T14:32:02.472050"
    },
    "cellView": "form",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 170,
     "status": "ok",
     "timestamp": 1446659140755,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "4896c353dcc58d9f",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "gt8UuSQA9frA",
    "outputId": "080025d5-d110-4975-e105-7635afaa3ce9"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/anaconda3/lib/python3.5/site-packages/ipykernel/__main__.py:3: DeprecationWarning: decodestring() is a deprecated alias, use decodebytes()\n",
      "  app.launch_new_instance()\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import Image\n",
    "import base64\n",
    "Image(data=base64.decodestring(\"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\".encode('utf-8')), embed=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Ft95NDUZy4Rr"
   },
   "source": [
    "That's equivalent to the function $\\hat{y} = w_2 x + w_1$. What we're trying to do is find the \"best\" weights $w_1$ and $w_2$. That will give us that green regression line above.\n",
    "\n",
    "What are the best weights? They're the weights that minimize the difference between our estimate $\\hat{y}$ and the actual y. Specifically, we want to minimize the sum of the squared errors, so minimize $\\sum{(\\hat{y} - y)^2}$, which is known as the *L2 loss*. So, the best weights are the weights that minimize the L2 loss."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "RHDGz_14vGNg"
   },
   "source": [
    "## Gradient descent\n",
    "\n",
    "What gradient descent does is start with random weights for $\\hat{y} = w_2 x + w_1$ and gradually moves those weights toward better values.\n",
    "\n",
    "It does that by following the downward slope of the error curves. Imagine that the possible errors we could get with different weights as a landscape. From whatever weights we have, moving in some directions will increase the error, like going uphill, and some directions will decrease the error, like going downhill. We want to roll downhill, always moving the weights toward lower error.\n",
    "\n",
    "How does gradient descent know which way is downhill? It follows the partial derivatives of the L2 loss. The partial derivative is like a velocity, saying which way the error will change if we change the weight. We want to move in the direction of lower error. The partial derivative points the way.\n",
    "\n",
    "So, what gradient descent does is start with random weights and gradually walk those weights toward lower error, using the partial derivatives to know which direction to go."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "W7SgnPAWBX2M"
   },
   "source": [
    "## The code again\n",
    "\n",
    "Let's go back to the code now, walking through it with many more comments in the code this time:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:32:55.672248",
     "start_time": "2016-09-16T14:32:55.024600"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 718,
     "status": "ok",
     "timestamp": 1446659172854,
     "user": {
      "color": "#1FA15D",
      "displayName": "Michael Piatek",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "00327059602783983041",
      "photoUrl": "//lh6.googleusercontent.com/-wKJwK_OPl34/AAAAAAAAAAI/AAAAAAAAAlk/Rh3u6O2Z7ns/s50-c-k-no/photo.jpg",
      "sessionId": "4896c353dcc58d9f",
      "userId": "106975671469698476657"
     },
     "user_tz": 480
    },
    "id": "4qtXAPGmBWUW",
    "outputId": "0664707f-ea8a-453b-fc3f-48d5ca0f76dc"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nOKOx9wqPr573zW3ifUW+p8RIREREJDIdgh8W9qJz7iOgCD9UrMM45wqATcD31/mYWRw+aWlq3dXO\nuQeccycC9wG1CUptqfDYsObLgCpgN+fcyjpTflg7Aw4OiyUDGIi/Jqu+970/7H1FGqVrjEREREQi\n0+fAqWaWg/+b7VZ8YYGOdi9wo5l9DXyJvxYoiR17kb5nZrOAfwBfAOnAEcCHocVfhR6PN7PXgXLn\n3EYzuwe418x2Ad7FD+E7DH8t0jNhm78lNMyuCJgR2l7t9U+Nva9Io5QYiYiIiESmy4GH8UlCIfA7\noFedNnWTk/qSlQYTmGaajk8ynsb39szGV8iraGSdeOABfAW7YuAl4NcAzrlVZvY7/FDBdHwluUvw\nQwbz8ZXkBgAb8ddd3Vrns1wTimEAsAg40TlX09T7ijTFnGvt/xURERERiRZmFoPvkXnIOXdbB77v\nMfieoW611exE2pJ6jERERESkQWY2EDgSeAs/hG4KkAk809h6Ip2Nii+IiIiISGMcMBE/bO2/+GIH\nRznndI8g6VI0lE5ERERERKKeeoxERERERCTqKTESEREREZGop8RIRERERESinhIjERERERGJekqM\nREREREQk6ikxEhERERGRqKfESEREREREop4SIxERERERiXr/H/4yLmZJbS/SAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9a3844c9b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#@test {\"output\": \"ignore\"}\n",
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Set up the data with a noisy linear relationship between X and Y.\n",
    "num_examples = 50\n",
    "X = np.array([np.linspace(-2, 4, num_examples), np.linspace(-6, 6, num_examples)])\n",
    "# Add random noise (gaussian, mean 0, stdev 1)\n",
    "X += np.random.randn(2, num_examples)\n",
    "# Split into x and y\n",
    "x, y = X\n",
    "# Add the bias node which always has a value of 1\n",
    "x_with_bias = np.array([(1., a) for a in x]).astype(np.float32)\n",
    "\n",
    "# Keep track of the loss at each iteration so we can chart it later\n",
    "losses = []\n",
    "# How many iterations to run our training\n",
    "training_steps = 50\n",
    "# The learning rate. Also known has the step size. This changes how far\n",
    "# we move down the gradient toward lower error at each step. Too large\n",
    "# jumps risk inaccuracy, too small slow the learning.\n",
    "learning_rate = 0.002\n",
    "\n",
    "# In TensorFlow, we need to run everything in the context of a session.\n",
    "with tf.Session() as sess:\n",
    "    # Set up all the tensors.\n",
    "    # Our input layer is the x value and the bias node.\n",
    "    input = tf.constant(x_with_bias)\n",
    "    # Our target is the y values. They need to be massaged to the right shape.\n",
    "    target = tf.constant(np.transpose([y]).astype(np.float32))\n",
    "    # Weights are a variable. They change every time through the loop.\n",
    "    # Weights are initialized to random values (gaussian, mean 0, stdev 0.1)\n",
    "    weights = tf.Variable(tf.random_normal([2, 1], 0, 0.1))\n",
    "\n",
    "    # Initialize all the variables defined above.\n",
    "    tf.initialize_all_variables().run()\n",
    "\n",
    "    # Set up all operations that will run in the loop.\n",
    "    # For all x values, generate our estimate on all y given our current\n",
    "    # weights. So, this is computing y = w2 * x + w1 * bias\n",
    "    yhat = tf.matmul(input, weights)\n",
    "    # Compute the error, which is just the difference between our \n",
    "    # estimate of y and what y actually is.\n",
    "    yerror = tf.sub(yhat, target)\n",
    "    # We are going to minimize the L2 loss. The L2 loss is the sum of the\n",
    "    # squared error for all our estimates of y. This penalizes large errors\n",
    "    # a lot, but small errors only a little.\n",
    "    loss = tf.nn.l2_loss(yerror)\n",
    "\n",
    "    # Perform gradient descent. \n",
    "    # This essentially just updates weights, like weights += grads * learning_rate\n",
    "    # using the partial derivative of the loss with respect to the\n",
    "    # weights. It's the direction we want to go to move toward lower error.\n",
    "    update_weights = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)\n",
    "\n",
    "    # At this point, we've defined all our tensors and run our initialization\n",
    "    # operations. We've also set up the operations that will repeatedly be run\n",
    "    # inside the training loop. All the training loop is going to do is \n",
    "    # repeatedly call run, inducing the gradient descent operation, which has the effect of\n",
    "    # repeatedly changing weights by a small amount in the direction (the\n",
    "    # partial derivative or gradient) that will reduce the error (the L2 loss).\n",
    "    for _ in range(training_steps):\n",
    "        # Repeatedly run the operations, updating the TensorFlow variable.\n",
    "        sess.run(update_weights)\n",
    "\n",
    "        # Here, we're keeping a history of the losses to plot later\n",
    "        # so we can see the change in loss as training progresses.\n",
    "        losses.append(loss.eval())\n",
    "\n",
    "    # Training is done, get the final values for the charts\n",
    "    betas = weights.eval()\n",
    "    yhat = yhat.eval()\n",
    "\n",
    "# Show the results.\n",
    "fig, (ax1, ax2) = plt.subplots(1, 2)\n",
    "plt.subplots_adjust(wspace=.3)\n",
    "fig.set_size_inches(10, 4)\n",
    "ax1.scatter(x, y, alpha=.7)\n",
    "ax1.scatter(x, np.transpose(yhat)[0], c=\"g\", alpha=.6)\n",
    "line_x_range = (-4, 6)\n",
    "ax1.plot(line_x_range, [betas[0] + a * betas[1] for a in line_x_range], \"g\", alpha=0.6)\n",
    "ax2.plot(range(0, training_steps), losses)\n",
    "ax2.set_ylabel(\"Loss\")\n",
    "ax2.set_xlabel(\"Training steps\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "lSWT9YsLP1de"
   },
   "source": [
    "This version of the code has a lot more comments at each step. Read through the code and the comments.\n",
    "\n",
    "The core piece is the loop, which contains a single `run` call. `run` executes the operations necessary for the `GradientDescentOptimizer` operation. That includes several other operations, all of which are also executed each time through the loop. The `GradientDescentOptimizer` execution has a side effect of assigning to weights, so the variable weights changes each time in the loop.\n",
    "\n",
    "The result is that, in each iteration of the loop, the code processes the entire input data set, generates all the estimates $\\hat{y}$ for each $x$ given the current weights $w_i$, finds all the errors and L2 losses $(\\hat{y} - y)^2$, and then changes the weights $w_i$ by a small amount in the direction of that will reduce the L2 loss.\n",
    "\n",
    "After many iterations of the loop, the amount we are changing the weights gets smaller and smaller, and the loss gets smaller and smaller, as we narrow in on near optimal values for the weights. By the end of the loop, we should be near the lowest possible values for the L2 loss, and near the best possible weights we could have."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "dFOk7ERATLk2"
   },
   "source": [
    "## The details\n",
    "\n",
    "This code works, but there are still a few black boxes that are worth diving into here. `l2_loss`? `GradientDescentOptimizer`? What exactly are those doing?\n",
    "\n",
    "One way to understand exactly what those are doing is to do the same thing without using those functions. Here is equivalent code that calculates the gradients (derivatives), L2 loss (sum squared error), and `GradientDescentOptimizer` from scratch without using those functions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2016-09-16T14:33:24.839102",
     "start_time": "2016-09-16T14:33:24.328170"
    },
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "collapsed": false,
    "executionInfo": {
     "elapsed": 657,
     "status": "ok",
     "timestamp": 1446499870301,
     "user": {
      "color": "",
      "displayName": "",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "",
      "photoUrl": "",
      "sessionId": "0",
      "userId": ""
     },
     "user_tz": 480
    },
    "id": "_geHN4sPTeRk",
    "outputId": "85c49bf6-8d07-401a-ae08-79c6933adff5"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9a3844c978>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#@test {\"output\": \"ignore\"}\n",
    "\n",
    "# Use the same input data and parameters as the examples above.\n",
    "# We're going to build up a list of the errors over time as we train to display later.\n",
    "losses = []\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    # Set up all the tensors.\n",
    "    # The input is the x values with the bias appended on to each x.\n",
    "    input = tf.constant(x_with_bias)\n",
    "    # We're trying to find the best fit for the target y values.\n",
    "    target = tf.constant(np.transpose([y]).astype(np.float32))\n",
    "    # Let's set up the weights randomly\n",
    "    weights = tf.Variable(tf.random_normal([2, 1], 0, 0.1))\n",
    "\n",
    "    tf.initialize_all_variables().run()\n",
    "\n",
    "    # learning_rate is the step size, so how much we jump from the current spot\n",
    "    learning_rate = 0.002\n",
    "\n",
    "    # The operations in the operation graph.\n",
    "    # Compute the predicted y values given our current weights\n",
    "    yhat = tf.matmul(input, weights)\n",
    "    # How much does this differ from the actual y?\n",
    "    yerror = tf.sub(yhat, target)\n",
    "    # Change the weights by subtracting derivative with respect to that weight\n",
    "    loss = 0.5 * tf.reduce_sum(tf.mul(yerror, yerror))\n",
    "    gradient = tf.reduce_sum(tf.transpose(tf.mul(input, yerror)), 1, keep_dims=True)\n",
    "    update_weights = tf.assign_sub(weights, learning_rate * gradient)\n",
    "    \n",
    "    # Repeatedly run the operation graph over the training data and weights.\n",
    "    for _ in range(training_steps):\n",
    "        sess.run(update_weights)\n",
    "    \n",
    "        # Here, we're keeping a history of the losses to plot later\n",
    "        # so we can see the change in loss as training progresses.\n",
    "        losses.append(loss.eval())\n",
    "\n",
    "    # Training is done, compute final values for the graph.\n",
    "    betas = weights.eval()\n",
    "    yhat = yhat.eval()\n",
    "\n",
    "# Show the results.\n",
    "fig, (ax1, ax2) = plt.subplots(1, 2)\n",
    "plt.subplots_adjust(wspace=.3)\n",
    "fig.set_size_inches(10, 4)\n",
    "ax1.scatter(x, y, alpha=.7)\n",
    "ax1.scatter(x, np.transpose(yhat)[0], c=\"g\", alpha=.6)\n",
    "line_x_range = (-4, 6)\n",
    "ax1.plot(line_x_range, [betas[0] + a * betas[1] for a in line_x_range], \"g\", alpha=0.6)\n",
    "ax2.plot(range(0, training_steps), losses)\n",
    "ax2.set_ylabel(\"Loss\")\n",
    "ax2.set_xlabel(\"Training steps\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "TzIETgHwTexL"
   },
   "source": [
    "This code looks very similar to the code above, but without using `l2_loss` or `GradientDescentOptimizer`. Let's look at exactly what it is doing instead.\n",
    "\n",
    "This code is the key difference:\n",
    "\n",
    ">`loss = 0.5 * tf.reduce_sum(tf.mul(yerror, yerror))`\n",
    "\n",
    ">`gradient = tf.reduce_sum(tf.transpose(tf.mul(input, yerror)), 1, keep_dims=True)`\n",
    "\n",
    ">`update_weights = tf.assign_sub(weights, learning_rate * gradient)`\n",
    "\n",
    "The first line calculates the L2 loss manually. It's the same as `l2_loss(yerror)`, which is half of the sum of the squared error, so $\\frac{1}{2} \\sum (\\hat{y} - y)^2$. With this code, you can see exactly what the `l2_loss` operation does. It's the total of all the squared differences between the target and our estimates. And minimizing the L2 loss will minimize how much our estimates of $y$ differ from the true values of $y$.\n",
    "\n",
    "The second line calculates $\\begin{bmatrix}\\sum{(\\hat{y} - y)*1} \\\\ \\sum{(\\hat{y} - y)*x_i}\\end{bmatrix}$. What is that? It's the partial derivatives of the L2 loss with respect to $w_1$ and $w_2$, the same thing as what `gradients(loss, weights)` does in the earlier code. Not sure about that? Let's look at it in more detail. The gradient calculation is going to get the partial derivatives of loss with respect to each of the weights so we can change those weights in the direction that will reduce the loss. L2 loss is $\\frac{1}{2} \\sum (\\hat{y} - y)^2$, where $\\hat{y} = w_2 x + w_1$. So, using the chain rule and substituting in for $\\hat{y}$ in the derivative, $\\frac{\\partial}{\\partial w_2} = \\sum{(\\hat{y} - y)\\, *x_i}$ and $\\frac{\\partial}{\\partial w_1} = \\sum{(\\hat{y} - y)\\, *1}$. `GradientDescentOptimizer` does these calculations automatically for you based on the graph structure.\n",
    "\n",
    "The third line is equivalent to `weights -= learning_rate * gradient`, so it subtracts a constant the gradient after scaling by the learning rate (to avoid jumping too far each time, which risks moving in the wrong direction). It's also the same thing that `GradientDescentOptimizer(learning_rate).minimize(loss)` does in the earlier code. Gradient descent updates its first parameter based on the values in the second after scaling by the third, so it's equivalent to the `assign_sub(weights, learning_rate * gradient)`.\n",
    "\n",
    "Hopefully, this other code gives you a better understanding of what the operations we used previously are actually doing. In practice, you'll want to use those high level operators most of the time rather than calculating things yourself. For this toy example and simple network, it's not too bad to compute and apply the gradients yourself from scratch, but things get more complicated with larger networks."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "colab": {
   "default_view": {},
   "name": "Untitled",
   "provenance": [],
   "version": "0.3.2",
   "views": {}
  },
  "kernelspec": {
   "display_name": "Python [default]",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
